一看到Builder就知道它是屬於Creational Pattern,那它可以用來解決什麼問題呢?現在就來認識一下Builder這個模式吧!
以火鍋作為例子,簡單的火鍋可以分成湯底、菜盤和肉盤,如果要更精緻的話可以加些不一樣的火鍋料、多一些沾醬、甚至是更高級的料理等等。一個簡單的火鍋物件就可能會需要這些元素,而這些元素就代表著創建一個物件所需要帶入的參數,不過並不是所有的火鍋都會需要用到所有的參數,沒用到的參數就顯得非常多餘,程式碼看起來就會非常冗贅。
而Builder就會讓一個火鍋元素編成一個步驟,例如addMeat()、addVeg()等,並讓每一種建立火鍋的物件來執行這一系列的步驟。而某些步驟你可能會需要不同的變化,比方說肉盤你可以選擇要牛肉、豬肉或雞肉等等,這樣的情況你會需要創建不同建立火鍋的物件,它們去實現相同的步驟,不過方式不同,如此一來就可以生成不一樣的火鍋物件。
接著可以更進一步創建一個Director類別,並定義執行建立火鍋步驟的順序,再讓建立火鍋的物件來實現步驟。
這樣,Director類別可以對客戶端完全隱藏建立火鍋的細節,而客戶只需要與Director類別及Builder做關聯,使用Director物件建構,再從Builder獲得結果就可以囉!
interface Builder {
void buildStepA();
void buildStepB();
void buildStepC();
ProductA getProduct();
}
class BuilderA implements Builder {
public void buildStepA() {
// StepA For ProductA
}
public void buildStepB() {
// StepB For ProductA
}
public void buildStepC() {
// StepC For ProductA
}
public ProductA getProduct() {
return new ProductA();
}
}
class BuilderB implements Builder {
public void buildStepA() {
// StepA For ProductB
}
public void buildStepB() {
// StepB For ProductB
}
public void buildStepC() {
// StepC For ProductB
}
public ProductB getProduct() {
return new ProductB();
}
}
class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void makeProduct(Type type) {
if (type) {
builder.buildStepA();
} else {
builder.buildStepB();
builder.buildStepC();
}
}
}
使用Builder就可以恣意安排建構的步驟,且這些步驟都具有重用性,方便調用。之後碰到生成某項產品需要許多參數或是某產品創建時可以用不同種方式實現(如豬肉鍋、牛肉鍋),就可以使用Builder來解決問題了!
除此之外,也歡迎大家走走逛逛關於我們團隊夥伴的文章
juck30808 - Python - 數位行銷分析與 Youtube API 教學
SiQing47 - 前端?後端?你早晚都要全端的,何不從現在開始?